title: 500.C 语言整型谜题 outline: deep

如题,此篇文章是描述C语言中的整数谜题。

假定机器字长是32位的,用2的补码表示整数。对以下C表达式,请问它们在所有情况下都正确吗?如果不是,请给出反例。

初始化:

int x = foo(); int y = bar(); unsigned ux = x; unsigned uy = y;

1. 若x ‹ 0, 则x * 2 ‹ 0

2. ux ›= 0

3. 若x & 7 == 7, 则(x ‹‹ 30) ‹ 0

4. ux › -1

5. 若x › y, 则-x ‹ -y

6. x * x ›= 0

7. 若x › 0 && y › 0, 则x + y › 0

8. 若x ›= 0, 则-x ‹= 0

9. 若x ‹= 0, 则-x ›= 0

答案如下:

1. 错。当x = INT_MIN

2. 正确。

3. 正确。

4. 错。-1被转换成UINT_MAX

5. 错。当x = -1, y = INT_MIN

6. 错。当x = 65535

7. 错。INT_MAX 和 INT_MAX

8. 正确。

9. 错。INT_MIN